#ifndef _ALARM_H
#define _ALARM_H
#include <stdint.h>
/* 报警类型枚举 */
typedef enum // Keil编译器使用1字节存储
{
    NO_ALARM,                                                          /* 无报警 */
    UPPER_LIMIT_ABS_ALARM,                                             /* 上限绝对值报警 */
    LOWER_LIMIT_ABS_ALARM,                                             /* 下限绝对值报警 */
    UPPER_LIMIT_ABS_HOLD_ALARM,                                        /* 上限绝对值报警带保持功能 */
    LOWER_LIMIT_ABS_HOLD_ALARM,                                        /* 下限绝对值报警带保持功能 */
    UPPER_LIMIT_DEVIATION_ALARM,                                       /* 上限偏差报警 */
    LOWER_LIMIT_DEVIATION_ALARM,                                       /* 下限偏差报警 */
    UPPER_AND_LOWER_LIMIT_DEVIATION_ALARM,                             /* 上下限偏差报警 */
    UPPER_LIMIT_DEVIATION_HOLD_ALARM,                                  /* 上限偏差报警带保持功能 */
    LOWER_LIMIT_DEVIATION_HOLD_ALARM,                                  /* 下限偏差报警带保持功能 */
    UPPER_AND_LOWER_LIMIT_DEVIATION_HOLD_ALARM,                        /* 上下限偏差报警带保持功能 */
    RANGE_DEVIATION_ALARM,                                             /* 范围偏差报警 */
    OFFLINE_ALARM,                                                     /* 断线报警 */
    DOUBLE_UPPER_AND_LOWER_LIMIT_ABS_ALARM = 16,                       /* 上下限绝对值报警 */
    DOUBLE_UPPER_AND_LOWER_LIMIT_DEVIATION_ALARM,                      /* 上下限偏差报警 */
    DOUBLE_UPPER_LIMIT_ABS_AND_LOWER_LIMIT_DEVIATION_ALARM,            /* 上限绝对值和下限偏差报警 */
    DOUBLE_UPPER_LIMIT_DEVIATION_AND_LOWER_LIMIT_ABS_ALARM,            /* 上限偏差和下限绝对值报警 */
    DOUBLE_UPPER_AND_LOWER_LIMIT_ABS_HOLD_ALARM,                       /* 上下限绝对值报警带保持功能 */
    DOUBLE_UPPER_AND_LOWER_LIMIT_DEVIATION_HOLD_ALARM,                 /* 上下限偏差报警带保持功能 */
    DOUBLE_UPPER_LIMIT_ABS_AND_LOWER_LIMIT_DEVIATION_HOLD_ALARM,       /* 上限绝对值和下限偏差报警带保持功能 */
    DOUBLE_UPPER_LIMIT_DEVIATION_AND_LOWER_LIMIT_ABS_HOLD_ALARM,       /* 上限偏差和下限绝对值报警带保持功能 */
    DOUBLE_RANGE_ABS_ALARM,                                            /* 范围上下限绝对值报警 */
    DOUBLE_RANGE_DEVIATION_ALARM,                                      /* 范围上下限偏差报警 */
    DOUBLE_RANGE_UPPER_LIMIT_ABS_AND_LOWER_LIMIT_DEVIATION_ALARM,      /* 范围上限绝对值和下限偏差报警 */
    DOUBLE_RANGE_UPPER_LIMIT_DEVIATION_AND_LOWER_LIMIT_ABS_ALARM,      /* 范围上限偏差和下限绝对值报警 */
    DOUBLE_RANGE_ABS_HOLD_ALARM,                                       /* 范围上下限绝对值报警带保持功能 */
    DOUBLE_RANGE_DEVIATION_HOLD_ALARM,                                 /* 范围上下限偏差报警带保持功能 */
    DOUBLE_RANGE_UPPER_LIMIT_ABS_AND_LOWER_LIMIT_DEVIATION_HOLD_ALARM, /* 范围上限绝对值和下限偏差报警带保持功能 */
    DOUBLE_RANGE_UPPER_LIMIT_DEVIATION_AND_LOWER_LIMIT_ABS_HOLD_ALARM, /* 范围上限偏差和下限绝对值报警带保持功能 */
} AlarmTypeDef;

/* 存储报警值结构体 */
typedef struct
{
    float alm1;    /* 报警值1,报警类型编号为1~11 */
    float alm2;    /* 报警值2,报警类型编号为1~11 */
    float alm1_lo; /* 报警值1下限,报警类型编号为16~31 */
    float alm1_up; /* 报警值1上限,报警类型编号为16~31 */
    float alm2_lo; /* 报警值2下限,报警类型编号为16~31 */
    float alm2_up; /* 报警值2上限,报警类型编号为16~31 */
} AlarmValueDef;

void init_alarm_config(float alm1, float alm2, float alm1_up, float alm1_lo, float alm2_up, float alm2_lo); /* 初始化报警配置 */
uint8_t trigger_alarm_by_type(AlarmTypeDef alarm_type, float setting_value, float process_value);           /* 根据报警类型触发报警 */

#endif
